package scala.org.zjt.spark


import org.apache.spark.{SparkConf, SparkContext}
/**
  * join(内连接)、leftjoin 、rightjoin 的用法
  *
  *   join
  *     1、只能join两个元素的数组(var1,var2)集合, 例如：Array((1, 30), (2, 29), (4, 21))
  *     2、根据var1判断是否相等，相等的向后关联。在value中存放一个Array
  *
  * @author
  * @create 2017-05-10 下午5:27
  **/
object JoinTest extends App{
  val conf = new SparkConf().setAppName("test").setMaster("local")
  val sc = new SparkContext(conf)
  sc.setLogLevel("ERROR")

  val idName = sc.parallelize(Array((1, "zhangsan"), (2, "lisi"), (3, "wangwu")))
  val idAge = sc.parallelize(Array((1, 30), (2, 29), (4, 21)))




  /**
    * 内连接
    *     当左右都不为null的时候，才会返回
    *
    * (1,(zhangsan,30))
    * (2,(lisi,29))
    */
  idName.join(idAge).collect().foreach(println)




  /**
    * 左外关联（left out join）
    *     右边没有对应的value，则用null填充。
    *
    * (1,(zhangsan,Some(30)))
    * (2,(lisi,Some(29)))
    * (3,(wangwu,None))
    */
  idName.leftOuterJoin(idAge).collect().foreach(println)




  /**
    * 右外关联（right outer join）右边为主体
    *     左边没有对应的值,则补null填充。
    *
    * (1,(Some(zhangsan),30))
    * (2,(Some(lisi),29))
    * (4,(None,21))
    */
  idName.rightOuterJoin(idAge).collect().foreach(println)



  sc.stop()
}
